本篇文章同步發表於 個人部落格 Jim's Blog
在前幾個章節中,我們實作了一些元件,但是元件我們不知道元件是什麼時候建立的也還不知道什麼時候會消失,今天就來說說元件從建立到銷毀的流程與事件
在Blazor元件中
Constructor
的用途不大,因為目前不支援建構式注入
建立一個 Lifecycle.razor
來觀察生命週期
@inject ILogger<Lifecycle> Logger
@code {
public override async Task SetParametersAsync(ParameterView parameters)
{
Logger.LogInformation("SetParametersAsync-開始");
await base.SetParametersAsync(parameters);
Logger.LogInformation("SetParametersAsync-結束");
}
protected override void OnInitialized()
{
Logger.LogInformation("OnInitialized-開始");
base.OnInitialized();
Logger.LogInformation("OnInitialized-結束");
}
protected override async Task OnInitializedAsync()
{
Logger.LogInformation("OnInitializedAsync-開始");
await base.OnInitializedAsync();
Logger.LogInformation("OnInitializedAsync-結束");
}
protected override void OnParametersSet()
{
Logger.LogInformation("OnParametersSet-開始");
base.OnParametersSet();
Logger.LogInformation("OnParametersSet-結束");
}
protected override async Task OnParametersSetAsync()
{
Logger.LogInformation("OnParametersSetAsync-開始");
await base.OnParametersSetAsync();
Logger.LogInformation("OnParametersSetAsync-結束");
}
protected override void OnAfterRender(bool firstRender)
{
Logger.LogInformation($"OnAfterRender({firstRender})-開始");
base.OnAfterRender(firstRender);
Logger.LogInformation($"OnAfterRender({firstRender})-結束");
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
Logger.LogInformation($"OnAfterRenderAsync({firstRender})-開始");
await base.OnAfterRenderAsync(firstRender);
Logger.LogInformation($"OnAfterRenderAsync({firstRender})-結束");
}
public void Dispose()
{
Logger.LogInformation("Dispose");
}
}
protected virtual void OnInitialized ();
protected virtual System.Threading.Tasks.Task OnInitializedAsync ();
這是元件初始化的執行的第一個方法
SetParametersAsync
完成後呼叫OnInitialized
然後才呼叫 OnInitializedAsync
OnInitializedAsync
OnInitializedAsync
在預先渲染時會被呼叫兩次
這邊指的預先渲染是為了SEO所做的處理,因為SPA對搜尋引擎來說是一張白紙,採用預先選染可以處理SEO不佳的問題,關於 Blazor 預先渲染該怎麼做,日後會再寫一篇文章來說明
protected virtual void OnParametersSet ();
protected virtual System.Threading.Tasks.Task OnParametersSetAsync ();
OnInitialized
OnInitializedAsync
之後被呼叫protected virtual void OnAfterRender (bool firstRender);
protected virtual System.Threading.Tasks.Task OnAfterRenderAsync (bool firstRender);
OnAfterRender
的重要用途是用於 JavaScript 初始化,因為需要DOM元素載入完成protected void StateHasChanged ();
經過上面的例子,我們可以了解Blazor元件的線性生命週期,但是在真正的現實狀況中,不是那麼的標準,要注意的是非同步方法的呼叫可能會導致生命週期順序紊亂或重疊,例如OnAfterRenderAsync
可能多次被呼叫,而上一次的 OnAfterRenderAsync
尚未執行完成,在使用上需要多注意
下一個章節是元件的事件處理